/**
 ******************************************************************************
 * @file           : bsp_common_config.h
 * @brief          : BSP Common Configuration Template
 ******************************************************************************
 * @attention
 *
 * BSP通用配置模板
 * 复制到你的项目并根据需要修改
 *
 ******************************************************************************
 */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BSP_COMMON_CONFIG_H
#define __BSP_COMMON_CONFIG_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "stm32f1xx.h"  /* 根据实际芯片修改：stm32f1xx/stm32f4xx/stm32h7xx */

/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/

/*============================================================================*/
/*                           系统配置                                          */
/*============================================================================*/

/**
 * @brief 系统时钟频率（Hz）
 */
#define BSP_SYSTEM_CLOCK        72000000    /* 72MHz for STM32F1 */

/**
 * @brief 调试配置
 */
#define BSP_DEBUG_ENABLE        1           /* 1=使能调试, 0=禁用 */
#define BSP_ASSERT_ENABLE       1           /* 1=使能断言, 0=禁用 */

/*============================================================================*/
/*                           日志系统配置                                      */
/*============================================================================*/

/**
 * @brief 日志系统选择
 * 0 = 禁用日志
 * 1 = 使用printf
 * 2 = 使用EasyLogger
 */
#define BSP_LOG_SYSTEM          1

/**
 * @brief 日志级别
 * 0 = DEBUG（全部）
 * 1 = INFO（信息及以上）
 * 2 = WARNING（警告及以上）
 * 3 = ERROR（仅错误）
 */
#define BSP_LOG_LEVEL           0

/**
 * @brief 日志颜色
 */
#define BSP_LOG_COLOR_ENABLE    1           /* 1=使能颜色, 0=禁用 */

/*============================================================================*/
/*                           超时配置                                          */
/*============================================================================*/

#define BSP_TIMEOUT_DEFAULT     1000        /* 默认超时时间（ms） */
#define BSP_TIMEOUT_SHORT       100         /* 短超时（ms） */
#define BSP_TIMEOUT_LONG        5000        /* 长超时（ms） */

/*============================================================================*/
/*                           缓冲区配置                                        */
/*============================================================================*/

#define BSP_RX_BUFFER_SIZE      256         /* 接收缓冲区大小 */
#define BSP_TX_BUFFER_SIZE      256         /* 发送缓冲区大小 */

/*============================================================================*/
/*                           DMA配置                                           */
/*============================================================================*/

#define BSP_USE_DMA             1           /* 1=使能DMA, 0=禁用 */
#define BSP_DMA_PRIORITY        DMA_PRIORITY_MEDIUM

/*============================================================================*/
/*                           中断优先级配置                                    */
/*============================================================================*/

/* 
 * STM32F1中断优先级说明：
 * - 抢占优先级：0-3（数字越小优先级越高）
 * - 子优先级：0-3
 */

#define BSP_SYSTICK_PREEMPT     0           /* SysTick抢占优先级 */
#define BSP_SYSTICK_SUB         0           /* SysTick子优先级 */

#define BSP_USART_PREEMPT       1           /* USART中断抢占优先级 */
#define BSP_USART_SUB           0           /* USART中断子优先级 */

#define BSP_SPI_PREEMPT         1           /* SPI中断抢占优先级 */
#define BSP_SPI_SUB             1           /* SPI中断子优先级 */

#define BSP_I2C_PREEMPT         1           /* I2C中断抢占优先级 */
#define BSP_I2C_SUB             2           /* I2C中断子优先级 */

#define BSP_TIM_PREEMPT         2           /* 定时器中断抢占优先级 */
#define BSP_TIM_SUB             0           /* 定时器中断子优先级 */

#define BSP_ADC_PREEMPT         2           /* ADC中断抢占优先级 */
#define BSP_ADC_SUB             1           /* ADC中断子优先级 */

#define BSP_CAN_PREEMPT         1           /* CAN中断抢占优先级 */
#define BSP_CAN_SUB             3           /* CAN中断子优先级 */

/*============================================================================*/
/*                           调试宏定义                                        */
/*============================================================================*/

#if (BSP_DEBUG_ENABLE == 1)
    #define BSP_DEBUG(fmt, ...)     printf("[DEBUG] " fmt "\r\n", ##__VA_ARGS__)
#else
    #define BSP_DEBUG(fmt, ...)     
#endif

#if (BSP_ASSERT_ENABLE == 1)
    #define BSP_ASSERT(expr)        \
        do {                        \
            if (!(expr)) {          \
                printf("ASSERT FAILED: %s, %s, line %d\r\n", #expr, __FILE__, __LINE__); \
                while(1);           \
            }                       \
        } while(0)
#else
    #define BSP_ASSERT(expr)
#endif

/*============================================================================*/
/*                           错误处理                                          */
/*============================================================================*/

/**
 * @brief 错误处理回调
 */
typedef void (*BSP_ErrorCallback_f)(const char *module, int error_code);

/* Exported macro ------------------------------------------------------------*/
/* Exported variables --------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/

#ifdef __cplusplus
}
#endif

#endif /* __BSP_COMMON_CONFIG_H */
